#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <sys/time.h>
#include <strings.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <stddef.h>
#include <shadow.h>
#include <crypt.h>
typedef struct train_s
{
    int length;
    char data[1000];
} train_t;
#define PROGRESS_BAR_WIDTH 50
// 用于接收小火车数据
int recvn(int sockfd, void *buf, int length);
// 用于下载文件
int recvFile(int sockfd);
// 用于上传文件
int transFile(int sockfd, const char *fileName, int fileNameLength);
// 按照指定字节数输出字符串
void print_by_bytes(const char *s, size_t num_bytes);
// 打印进度条
void print_progress_bar(off_t current_size, off_t total_size);

#define ARGS_CHECK(argc, num)       \
    {                               \
        if (argc != num)            \
        {                           \
            printf("error args\n"); \
            return -1;              \
        }                           \
    }
#define ERROR_CHECK(ret, retval, func_name) \
    {                                       \
        if (ret == retval)                  \
        {                                   \
            printf("errno=%d,", errno);     \
            fflush(stdout);                 \
            perror(func_name);              \
            return -1;                      \
        }                                   \
    }
